package com.kaguya.bridge;

/**
 * 桥接模式 结构性 抽象和实现解耦，将抽象与实现分离开来，使它们可以独立变化。
 *
 * 适用于类中出现两个独立变化的维度，且两个维度都需要扩展，比如品牌和功率，一个软件支持的文件格式和支持的系统
 *
 * 在软件开发中，有时桥接（Bridge）模式可与设配器模式联合使用。
 * 当桥接（Bridge）模式的实现化角色的接口与现有类的接口不一致时，可以在二者中间定义一个适配器将二者连接起来
 */
public class Bridge {
    public static void main(String[] args) {
        // 可以根据自己的需要，旋转支持的系统类型和文件格式类型，同时方便二者的扩展
        SupportSys pcSupport = new PhoneSupport(new ImageFileType());
        pcSupport.supportSystemType();
    }
}
/**
 * 桥接
 */

/**
 * 需要扩展的维度1 文件格式
 */
interface FileType {
    void supportFileType();
}
/**
 * 需要扩展的维度2 支持的系统
 */
abstract class SupportSys {
    FileType fileType ;

    SupportSys(FileType fileType) {
        this.fileType = fileType;
    }

    abstract void supportSystemType();
}
/**
 * 文件格式1
 */
class ImageFileType implements FileType {

    @Override
    public void supportFileType() {
        System.out.println("support png,jpg,jpeg,gif,webp");
    }
}
/**
 * 文件格式2
 */
class MediaFileType implements FileType {

    @Override
    public void supportFileType() {
        System.out.println("support mp3,mp4,avi,mov,mpeg4");
    }
}
/**
 * 支持系统1
 */
class PCSupport extends SupportSys {

    PCSupport(FileType fileType) {
        super(fileType);
    }

    @Override
    public void supportSystemType() {
        System.out.println("windows,mac os, linux");
        fileType.supportFileType();
    }
}
/**
 * 支持系统2
 */
class PhoneSupport extends SupportSys {

    PhoneSupport(FileType fileType) {
        super(fileType);
    }

    @Override
    public void supportSystemType() {
        System.out.println("ios Android");
        fileType.supportFileType();
    }
}